package com.ycxy.school.express.service;

import com.ycxy.school.express.pojo.dto.OrderAddNewDTO;
import com.ycxy.school.express.pojo.dto.OrderUpdateDTO;
import com.ycxy.school.express.pojo.dto.PaymentAddNewDTO;
import com.ycxy.school.express.pojo.vo.OrderDetailVO;
import com.ycxy.school.express.pojo.vo.OrderListItemVO;

import java.util.List;

/**
 * @Author jayLuo
 * @Date 2023/1/8 16:12
 * @PackageName:com.ycxy.school.express.service
 * @ClassName: IOrderService
 * @Description: TODO
 * @Version 1.0
 */
public interface IOrderService {

    /**
     * 用户下订单
     *
     * @param orderAddNewDTO 订单数据
     */
    void createOrder(OrderAddNewDTO orderAddNewDTO);

    /**
     * 骑手接单
     *
     * @param id 订单id
     */
    void receiveOrder(Long id,String sn);


    /**
     * 用户手动删除订单
     *
     * @param id
     */
    void deleteByUser(Long id);

    /**
     * 系统删除订单
     *
     * @param id
     */
    void deleteBySystem(Long id);

    /**
     * 用户撤销订单
     *
     * @param id
     */
    void withdrawOrder(Long id);

    /**
     * 修改订单信息
     *
     * @param id 用户id
     * @param orderUpdateDTO 修改的订单信息
     */
    void updateOrder(Long id, OrderUpdateDTO orderUpdateDTO);

    /**
     * 查询订单列表
     *
     * @return 订单列表VO
     */
    List<OrderListItemVO> list();

    /**
     * 根据用户id查询订单列表
     *
     * @return 订单列表
     */
    List<OrderListItemVO> listByUserId();

    /**
     * 根据配送员id查询订单列表
     *
     * @return 配送员id
     */
    List<OrderListItemVO> listByStaffId();

    /**
     * 查询等待接单的订单列表
     *
     * @return 订单列表
     */
    List<OrderListItemVO> waitOrderList();

    /**
     * 查询配送中的订单列表
     *
     * @return 订单列表
     */
    List<OrderListItemVO> transportOrderList();

    /**
     * 根据配送员id查询配送中的订单列表
     *
     * @return 订单列表
     */
    List<OrderListItemVO> transportOrderListByStaffId();

    /**
     * 根据配送员id查询订单完成的订单列表
     *
     * @return 订单列表
     */
    List<OrderListItemVO> completeOrderListByStaffId();

    /**
     * 查询可评论的订单列表
     *
     * @return 订单列表
     */
    List<OrderListItemVO> listByEvaluate();


    /**
     * 查询未支付的订单列表
     *
     * @return 订单列表
     */
    List<OrderListItemVO> listByPayTime();


    /**
     * 查询已删除的订单
     *
     * @return 订单列表
     */
    List<OrderListItemVO> listByDelete();

    /**
     * 根据id查询订单详情
     *
     * @param id 订单id
     * @return 订单详情
     */
    OrderDetailVO getOrderDetail(Long id);

    /**
     * 将订单状态设置为已完成
     *
     * @param id 订单id
     */
    void setComplete(Long id);

    /**
     * 将订单状态设置为异常
     *
     * @param id 订单id
     */
    void setError(Long id);

    /**
     * 还原订单
     *
     * @param id 订单id
     */
    void restoreOrder(Long id);

    /**
     * 获取最新创建的订单
     *
     * @return
     */
    OrderListItemVO getOrderNew();

    /**
     * 统计等待接单的订单数
     *
     * @return
     */
    int countByWait();

    /**
     * 统计派送中的订单数
     *
     * @return
     */
    int countByTransport();

    /**
     * 统计已完成的订单数
     *
     * @return
     */
    int countByComplete();
}
